赤い星での並列処理とは、ローバーのナビゲーションや生命信号のテレメトリー、衛星との接続といった複数の独立した操作をシステムが停止せずに管理する技術です。Goでは、 独立して実行されるタスク と呼ばれます goroutine。
1. 非決定性の原則
異なるゴルーチン内の操作は 任意の順序で実行される可能性があると常に仮定するのが最善です。Goランタイムはタスクを利用可能なコアにスケジューリングするため、明示的な同期なしでは、あるローバーがスキャンを終了してから別のローバーが送信を開始するという順序を頼ることができません。
go printGopher(c) // 新しい独立したタスクを起動します
2. 同期の仕組み
これらのタスクを管理するために、Goは主に2つのツールを提供しています:
- 相互排他: ゴルーチンは
mutexを用いて、同時に何かを行うことを互いに排除できます。 - select文: これは、各ケースがチャネルの受信または送信を持つ、switch文に似た構文です。
select一つのケースが準備できたら待機し、その後実行します。
3. ウェーカーの骨格
長期間稼働するウェーカーは通常、無限ループと select を組み合わせて、複数の通信チャネルを同時に監視します:
func worker() {
for {
select {
// チャネルの待ちを行います。
}
}
}
for {
select {
// チャネルの待ちを行います。
}
}
}
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>